var express = require('express');
var router = express.Router();
const sql = require("../sql/sql");//引入增删改查命令
const cart = require("../sql/cart");//引入购物车数据集合
const pro = require("../sql/pro");//引入商品数据集合
const tools = require("../tools/index");
const uuid = require("node-uuid")

/* GET home page. */
//获取购物车信息的接口路由
router.get('/', function(req, res, next) {
  const userId = req.query.userId;
  const token = req.headers.token;
  // 验证token
  tools.verify(token).then((tokendata)=>{
    sql.find(cart,{userId},{_id:0,__v:0}).then((data)=>{
      if(data.length<1){
        res.send({
          state:201,
          title:"读取成功，购物车没有数据",
          data: "NOT DATA"
        })
      }else{
        res.send({
          state:200,
          title:"读取成功",
          data:data[0]
        })
      }
    })
  }).catch((err)=>{
    res.send({
      state:10086,
      title:"登录已失效，请重新登录",
      data: err
    })
  })
});

/**
* @apiGroup 购物车
* @api {get} /api/cart 获取购物车数据
* @apiVersion 0.0.0
* @apiDescription 根据用户id，获取购物车数据
* @apiParam {string} userId 用户的id
* @apiParam {string} token 后端的登录状态token
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*   state:201,
    title:"读取成功，购物车没有数据",
    data: "NOT DATA"
* }
  { state:200,
    title:"读取成功",
    data:data[0]
  }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":10086,
*    "title":"登录已失效，请重新登录",
*    "data":err
* }
* @apiSampleRequest http://localhost:3001/api/cart
*/


//购物车添加商品的接口路由
router.post('/add', function(req, res, next) {
  const userId = req.body.userId
  console.log(userId)
  const proId = req.body.proId
  const token = req.headers.token
  tools.verify(token).then((tokendata)=>{
    sql.find(pro,{proId},{}).then((data)=>{
      if(data.length>0){
        sql.find(cart,{userId},{}).then((data)=>{
          if(data.length<1){
            sql.insert(cart,{
              userId:userId,
              cartId:uuid.v1(),
              proData:[{
                proId:proId,
                num:1,
                time: Date.now(),
                flag: true
              }]
            }).then(()=>{
              res.send({
                state:200,
                title:"该商品第一次添加到购物车数据库"
              })
            })
          }else{
            let arr = data[0].proData
            let i = 0
            onoff = arr.some((val,index)=>{
              i = index
              return val.proId === proId
            })
            if(onoff){
              arr[i].num++,
              arr[i].time = Date.now()
            }else{
              arr.push({
                proId:proId,
                num:1,
                time: Date.now(),
                flag: true
              })
            }
            sql.update(cart,{userId},{proData:arr}).then(()=>{
              res.send({
                state:200,
                title:"更新购物车数据集合成功"
              })
            })
          }
        })    
      }else{
        res.send({
          state:201,
          title:"商品不存在"
        })
      }
    })
  }).catch((err)=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录",
      data: err
    })
  })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/add 添加购物车数据
* @apiVersion 0.0.0
* @apiDescription 根据用户id，将商品id对应的数据存储到购物车数据集合
* @apiParam {string} userId 用户的id
* @apiParam {string} proId 商品的id
* @apiParam {string} token 后端的登录状态token
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"该商品第一次添加到购物车数据库",
* }
* {
*    "state":200,
*    "title":"更新购物车数据集合成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":10086,
*    "title":"登录信息已失效，请重新登录",
*    "data":err
* }
* {
*    "code":201,
*    "title":"商品不存在",
* }
* @apiSampleRequest http://localhost:3001/api/cart/add
*/

//购物车集合中商品数量更新的接口路由
router.post('/updateNum', function(req, res, next) {
  const token = req.headers.token
  const {userId, proId, num} = req.body
  tools.verify(token).then((tokendata)=>{
    //以用户id来查询购物车集合的数据
    sql.find(cart,{userId}).then((data) => {
      //这里的data是个数组，和当时封装node操作数据库有关
      console.log(data)
      //把购物车集合中的商品数据保存出来
      let arr = data[0].proData
      let i = 0
      //val是数组proData里的对象
      arr.some((val,index)=>{
        i = index
        return val.proId === proId
      })
      arr[i].num = num-0
      sql.update(cart,{userId},{
        proData: arr
      }).then(()=>{
        res.send({
          state: 200,
          title: '修改数量成功'
        })
      })
    })
  }).catch((err)=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录",
      data: err
    })
  })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/updateNum 修改购物车中商品数量
* @apiVersion 0.0.0
* @apiDescription 根据用户id和商品id和数量修改购物车商品数据集合
* @apiParam {string} userId 用户的id
* @apiParam {string} proId 要修改的购物车集合中商品的id
* @apiParam {number} num 要修改的购物车结合中商品的数量
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"修改数量成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":10086,
*    "title":"登录信息已失效，请重新登录",
*    "data":err
* }
* @apiSampleRequest http://localhost:3001/api/cart/updateNum
*/

//购物车集合中商品数量更新的接口路由
router.post('/del', function(req, res, next) {
  const token = req.headers.token
  const {userId, proId} = req.body
  tools.verify(token).then((tokendata)=>{
    //以用户id来查询购物车集合的数据
    sql.find(cart,{userId}).then((data) => {
      //把购物车集合中的商品数据保存出来
      let arr = data[0].proData
      let i = 0
      //val是数组proData里的对象
      arr.some((val,index)=>{
        i = index
        return val.proId === proId
      })
      //根据proId找到索引把proData中第i个商品的数据删除
      arr.splice(i,1)
      sql.update(cart,{userId},{
        proData: arr
      }).then(()=>{
        res.send({
          state: 200,
          title: '删除成功'
        })
      })
    })
  }).catch((err)=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录",
      data: err
    })
  })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/del 删除购物车中的某一商品
* @apiVersion 0.0.0
* @apiDescription 根据用户id和商品id删除购物车集合中某一商品
* @apiParam {string} userId 用户的id
* @apiParam {string} proId 要删除的购物车集合中商品的id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"删除成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":10086,
*    "title":"登录信息已失效，请重新登录",
*    "data":err
* }
* @apiSampleRequest http://localhost:3001/api/cart/del
*/

//购物车集合中商品选中状态更新的接口路由
router.post('/updateFlag', function(req, res, next) {
  const token = req.headers.token
  const {userId, proId, flag} = req.body
  tools.verify(token).then((tokendata)=>{
    //以用户id来查询购物车集合的数据
    sql.find(cart,{userId}).then((data) => {
      //把购物车集合中的商品数据保存出来
      let arr = data[0].proData
      let i = 0
      //val是数组proData里的对象
      arr.some((val,index)=>{
        i = index
        return val.proId === proId
      })
      //根据proId找到索引把proData中第i个商品的数据删除
      arr[i].flag = flag
      sql.update(cart,{userId},{
        proData: arr
      }).then(()=>{
        res.send({
          state: 200,
          title: '修改状态成功'
        })
      })
    })
  }).catch((err)=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录",
      data: err
    })
  })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/updataFlag 修改购物车集合中商品的选中状态
* @apiVersion 0.0.0
* @apiDescription 根据用户id和商品id和选中状态更新商品的选中状态
* @apiParam {string} userId 用户的id
* @apiParam {string} proId 要修改选中状态的购物车集合中商品的id
* @apiParam {boolean} flag 要修改后的状态
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"修改状态成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":10086,
*    "title":"登录信息已失效，请重新登录",
*    "data":err
* }
* @apiSampleRequest http://localhost:3001/api/cart/updataFlag
*/

//购物车集合中商品选中状态更新的接口路由
router.post('/updateAllFlag', function(req, res, next) {
  const token = req.headers.token
  const {userId, flag} = req.body
  tools.verify(token).then((tokendata)=>{
    //以用户id来查询购物车集合的数据
    sql.find(cart,{userId}).then((data) => {
      //把购物车集合中的商品数据保存出来
      let arr = data[0].proData
      for(let i=0;i<arr.length;i++){
        arr[i].flag = flag
      }
      sql.update(cart,{userId},{
        proData: arr
      }).then(()=>{
        res.send({
          state: 200,
          title: '修改状态成功'
        })
      })
    })
  }).catch((err)=>{
    res.send({
      state:10086,
      title:"登录信息已失效，请重新登录",
      data: err
    })
  })
});


/**
* @apiGroup 购物车
* @api {post} /api/cart/updataAllFlag 修改购物车集合中所有商品的选中状态
* @apiVersion 0.0.0
* @apiDescription 根据用户id和选中状态更新所有商品的选中状态
* @apiParam {string} userId 用户的id
* @apiParam {boolean} flag 要修改后的状态
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"修改状态成功",
* }
* @apiError {number} state 请求状态
* @apiError {string} title 请求说明
* @apiError {string} data 请求数据
* @apiErrorExample {json} Error-Response:
* {
*    "code":10086,
*    "title":"登录信息已失效，请重新登录",
*    "data":err
* }
* @apiSampleRequest http://localhost:3001/api/cart/updataAllFlag
*/


module.exports = router;
